home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / test / dumpbpages.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  6.2 KB  |  282 lines

  1. static    char    dumpbpages_c[] = "$Header: /private/postgres/src/test/RCS/dumpbpages.c,v 1.8 1990/04/28 16:24:21 mao Version_2 $";
  2.  
  3. #include <sys/file.h>
  4. #include <stdio.h>
  5. #include <strings.h>
  6.  
  7. #include "magic.h"
  8.  
  9. #include "c.h"
  10. #include "os.h"
  11. #include "clib.h"
  12.  
  13. #include "block.h"
  14. #include "btree.h"
  15. #include "bufmgr.h"
  16. #include "bufpage.h"
  17. #include "htup.h"
  18. #include "itemid.h"
  19. #include "page.h"
  20. #include "part.h"
  21. #include "tim.h"
  22. #include "xid.h"
  23.  
  24. #define DEFAULT_TYPE    'r'
  25.  
  26. char        *Progname;
  27. /* int    Version; */
  28. int        Type;
  29. char        Buf[BLCKSZ];
  30.  
  31. /*
  32.  * ItemPointerFormExternal --
  33.  */
  34. extern
  35. String
  36. ItemPointerFormExternal ARGS((
  37.     ItemPointer    pointer
  38. ));
  39.  
  40. main(argc, argv)
  41. int    argc;
  42. char    *argv[];
  43. {
  44.     int        s;
  45.     int        errors = 0;
  46.     char        *cp;
  47.     extern        dumprelation();
  48.  
  49.     Progname = rindex(argv[0], '/');
  50.     Progname = (Progname != (char *)NULL) ? Progname + 1 : argv[0];
  51.     Type = DEFAULT_TYPE;
  52.     if (! --argc)
  53.         dumprelation(fileno(stdin), "<stdin>");
  54.     while (argc--) {
  55.         argv++;
  56.         if (**argv != '-') {
  57.             if ((s = open(*argv, O_RDONLY, 00)) < 0) {
  58.                 perror(*argv);
  59.                 continue;
  60.             }
  61.             dumprelation(s, *argv);
  62.             close(s);
  63.             continue;
  64.         }
  65.         cp = *argv;
  66.         if ((Type = *++*argv) == '\0' || *++*argv != '\0') {
  67.             Type = DEFAULT_TYPE;
  68.             errors++;
  69.             fprintf(stderr, "%s: bad argument %s", Progname, cp);
  70.             continue;
  71.         }
  72.     }
  73.     if (errors)
  74.         fprintf(stderr, "Usage: %s {[-(b|r|i)] relpath}+\n", Progname);
  75. }
  76.  
  77. dumprelation(fd, path)
  78. int    fd;
  79. char    path[];
  80. {
  81.     int        nr, pageno = 0;
  82.     int        someBlocks;
  83.     extern        dumppage();
  84.  
  85.     someBlocks = 0;
  86.     while ((nr = read(fd, Buf, sizeof Buf)) == sizeof Buf) {
  87.         if (someBlocks) {
  88.             putchar('\n');
  89.         }
  90.         DumpBlock(path, pageno++);
  91.         someBlocks = 1;
  92.     }
  93.     if (nr > 0)
  94.         fprintf(stderr, "%s: %d bytes after last block\n", path, nr);
  95. }
  96.  
  97. DumpBlock(path, blockNumber)
  98.     char    path[];
  99.     int    blockNumber;
  100. {
  101.     PageSize    pageSize;
  102.     int        pageNumber;
  103.     Page        page;
  104.  
  105.     pageSize = PageGetPageSize((Page)Buf);
  106.  
  107.     printf("%s[block=%d]:pageSize=%d\n", path, blockNumber, pageSize);
  108.  
  109.     for (pageNumber = 0; pageNumber < sizeof Buf / pageSize;
  110.             pageNumber += 1) {
  111.         page = (Page)&Buf[pageNumber * pageSize];
  112.         if (pageSize != PageGetPageSize(page)) {
  113.             fprintf(stderr, "DumpBlock: page %d: pageSize %d\n",
  114.                 pageNumber, PageGetPageSize(page));
  115.         }
  116.         DumpPage(page, blockNumber, pageNumber);
  117.     }
  118. }    
  119.  
  120. DumpPage(page, blockNumber, pageNumber)
  121.     Page    page;
  122.     int    blockNumber;
  123.     int    pageNumber;
  124. {
  125.     ItemId        lp;
  126.     HeapTuple    tup;
  127.     int        flags, i, nline;
  128.     PagePartition    partition;
  129.     ItemPointerData    pointerData;
  130.     int        hikeyfound;
  131.  
  132.     partition = CreatePagePartition(sizeof Buf, PageGetPageSize(page));
  133.  
  134.     printf("\t[subblock=%d]:lower=%d:upper=%d:special=%d\n", pageNumber,
  135.         ((PageHeader)page)->pd_lower, ((PageHeader)page)->pd_upper,
  136.         ((PageHeader)page)->pd_special);
  137.  
  138.     printf("\t:MaxOffsetIndex=%d:InternalFragmentation=%d\n",
  139.         (int16)PageGetMaxOffsetIndex(page),
  140.         PageGetInternalFragmentation(page));
  141.  
  142.     nline = 1 + (int16)PageGetMaxOffsetIndex(page);
  143.  
  144.     /* add printing of the specially allocated fields */
  145. {
  146.     int    i;
  147.     char    *cp;
  148.  
  149.     i = PageGetSpecialSize(page);
  150.     cp = PageGetSpecialPointer(page);
  151.  
  152.     printf("\t:SpecialData=");
  153.  
  154.     while (i > 0) {
  155.         printf(" 0x%02x", *cp);
  156.         cp += 1;
  157.         i -= 1;
  158.     }
  159.     printf("\n");
  160. }
  161.     hikeyfound = 0;
  162.  
  163.     for (i = 0; i < nline; i++) {
  164.         lp = ((PageHeader)page)->pd_linp + i;
  165.         flags = (*lp).lp_flags;
  166.         ItemPointerSet(&pointerData, partition, blockNumber, pageNumber,
  167.             1 + i);
  168.         printf("%s:off=%d:flags=0x%x:len=%d",
  169.             ItemPointerFormExternal(&pointerData), (*lp).lp_off,
  170.             flags, (*lp).lp_len);
  171.         if (flags & LP_USED)
  172.             printf(":USED");
  173.         if (flags & LP_IVALID)
  174.             printf(":IVALID");
  175.         if (flags & LP_DOCNT) {
  176.             ItemPointer    pointer;
  177.  
  178.             pointer = (ItemPointer)(uint16 *)
  179.                 ((char *)page + (*lp).lp_off);
  180.             
  181.             printf(":DOCNT@%s", ItemPointerFormExternal(pointer));
  182.         }
  183.         if (flags & LP_CTUP)
  184.             printf(":CTUP");
  185.         if (flags & LP_LOCK)
  186.             printf(":LOCK");
  187.  
  188.         /* XXX not really all indices, just btree indices */
  189.         if (Type == 'i' && (flags & LP_USED) && !(flags & LP_CTUP)) {
  190.             BTreeItemData    btitem;
  191.             ItemPointer    iptr;
  192.  
  193.             bcopy((char *) &((char *)page)[(*lp).lp_off],
  194.                 (char *) &btitem, sizeof(btitem));
  195.  
  196.             iptr = &btitem.header.ituple.t_tid;
  197.  
  198.             printf(" :: ");
  199.             if (btitem.header.flags & BTREE_ITEM_IS_LEAF)
  200.                 printf(":LEAF");
  201.             else
  202.                 printf(":INTERNAL");
  203.             if (btitem.header.flags & BTREE_ITEM_IS_HIGHKEY) {
  204.                 printf(":HIKEY");
  205.                 hikeyfound++;
  206.             }
  207.  
  208.             printf(":[%d,%d,%d]:key %ld\n",
  209.                 ItemPointerGetBlockNumber(iptr),
  210.                 ItemPointerGetPageNumber(iptr),
  211.                 ItemPointerGetOffsetNumber(iptr),
  212.                 btitem.form.filler);
  213.         } else if (Type == 'r' && (flags & LP_USED
  214.                && !(flags & LP_CTUP)
  215.                && !(flags & LP_LOCK))) {
  216.  
  217.             HeapTupleData    htdata;
  218.  
  219.             bcopy((char *) &((char *)page)[(*lp).lp_off],
  220.                 (char *) &htdata, sizeof(htdata));
  221.  
  222.             tup = &htdata;
  223.  
  224.             if (flags & LP_DOCNT) {
  225.                 bcopy((char *) &((char *)tup)[TCONTPAGELEN],
  226.                     (char *) &htdata, sizeof(tup));
  227.             }
  228.  
  229.             printf("\n\t:ctid=%s:oid=%ld",
  230.                 ItemPointerFormExternal(&tup->t_ctid),
  231.                 tup->t_oid);
  232.             printf(":natts=%d:thoff=%d:vtype=`%c' (0x%02x):",
  233.                 tup->t_natts,
  234.                 tup->t_hoff, tup->t_vtype, tup->t_vtype);
  235.  
  236.             printf("\n\t:tmin=%d:cmin=%u:",
  237.                 tup->t_tmin, tup->t_cmin);
  238.             printf("xmin=0x%02x%02x%02x%02x%02x:",
  239.                 (unsigned char) tup->t_xmin[0],
  240.                 (unsigned char) tup->t_xmin[1],
  241.                 (unsigned char) tup->t_xmin[2],
  242.                 (unsigned char) tup->t_xmin[3],
  243.                 (unsigned char) tup->t_xmin[4]);
  244.  
  245.             printf("\n\t:tmax=%d:cmax=%u:",
  246.                 tup->t_tmax, tup->t_cmax);
  247.             printf("xmax=0x%02x%02x%02x%02x%02x:",
  248.                 (unsigned char) tup->t_xmax[0],
  249.                 (unsigned char) tup->t_xmax[1],
  250.                 (unsigned char) tup->t_xmax[2],
  251.                 (unsigned char) tup->t_xmax[3],
  252.                 (unsigned char) tup->t_xmax[4]);
  253.  
  254.             printf("\n\t:chain=%s:anchor=%s:\n",
  255.                 ItemPointerFormExternal(&tup->t_chain),
  256.                 ItemPointerFormExternal(&tup->t_anchor));
  257.         } else
  258.             putchar('\n');
  259.     }
  260.     if (Type == 'i')
  261.         printf("\tfound %d high key%s\n",
  262.             hikeyfound, (hikeyfound == 1 ? "" : "s"));
  263. }
  264.  
  265. String
  266. ItemPointerFormExternal(pointer)
  267.     ItemPointer    pointer;
  268. {
  269.     static char    itemPointerString[32];
  270.  
  271.     if (!ItemPointerIsValid(pointer)) {
  272.         bcopy("<-,-,->", itemPointerString, sizeof "<-,-,->");
  273.     } else {
  274.         sprintf(itemPointerString, "<%lu,%u,%u>",
  275.             ItemPointerGetBlockNumber(pointer),
  276.             ItemPointerSimpleGetPageNumber(pointer),
  277.             ItemPointerSimpleGetOffsetNumber(pointer));
  278.     }
  279.  
  280.     return (itemPointerString);
  281. }
  282.